package cn.lingyangwl.agile.msg.push.model.entity;

import cn.lingyangwl.agile.model.*;
import cn.lingyangwl.agile.msg.push.api.constatnts.*;
import cn.lingyangwl.agile.msg.push.api.model.content.MsgField;
import cn.lingyangwl.agile.tenant.core.*;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONReader;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.handlers.AbstractJsonTypeHandler;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.util.Date;
import java.util.List;

/**
 * 消息推送
 *
 * @author shenguangyang
 */
@Getter
@Setter
@Accessors(chain = true)
@TableName(value = "mps_msg_history", autoResultMap = true)
@DataIsolation(filterTenant = true, filterMainTenant = true, tableName = "mps_msg_history")
public class MsgHistory extends BasePO {

    public static LambdaQueryWrapper<MsgHistory> lqw() {
        return Wrappers.lambdaQuery();
    }

    @TableId
    private Long id;

    /**
     * 消息标题
     */
    private String title;

    /**
     * 推送的页面地址, 比如微信公众号推送后可以点击详情跳转到目标页面
     */
    private String pageUrl;

    /**
     * 消息通知id
     * @see MsgNotice#getId()
     */
    private Long noticeId;

    /**
     * 通知渠道id
     * @see NoticeChannel#getId()
     */
    private Long channelId;

    /**
     * 消息重试次数
     */
    private Integer retryCount;

    /**
     * 原始模板遍历, 用户请求的
     */
    @TableField(typeHandler = MsgFieldHandler.class)
    private List<MsgField> msgFields;

    /**
     * 渠道类型
     * @see ChannelTypeEnum
     */
    private String channelType;

    /**
     * 渠道编码
     */
    private String channelCode;

    /**
     * 消息组id
     */
    private Long groupId;

    /**
     * 消息组名称
     */
    private String groupName;

    /**
     * 消息推送的状态
     */
    private String status;

    /**
     * 推送结果, 可以存放推送组件返回值或者异常信息
     */
    private String pushResult;

    /**
     * 推送时间
     */
    private Date pushTime;

    /**
     * 业务主键
     */
    private String bizKey;

    /**
     * 业务类型
     */
    private String bizType;

    /**
     * 接受者用户编码，可直接指定接受者手机号或邮箱地址等
     */
    private String toUser;

    private String tenantId;
    private String mainTenantId;

    public MsgHistory() {
        this.retryCount = 0;
    }

    public static class MsgFieldHandler extends AbstractJsonTypeHandler<List<MsgField>> {

        @Override
        protected List<MsgField> parse(String json) {
            return JSON.parseArray(json, MsgField.class, JSONReader.Feature.InitStringFieldAsEmpty);
        }

        @Override
        protected String toJson(List<MsgField> obj) {
            return JSON.toJSONString(obj).trim();
        }
    }
}